特意找点sql
注入的题来写写(万一能自己写出来了呢……)
开题是登录界面,给了源逻辑
1 | sqlquery : select * from users where username='' and passwd='' |
扫了一下目录,robots.txt
有东西,提示hint.txt
,转到hint.txt
,发现以下:
1 | $black_list = "/limit|by|substr|mid|,|admin|benchmark|like|or|char|union|substring|select|greatest|%00|\'|=| |in|<|>|-|\.|\(\)|#|and|if|database|users|where|table|concat|insert|join|having|sleep/i"; |
需要获得admin
的密码,给了黑名单。
select union不能用,查询就用正则Regexp
,nice,现学一下……
SQL应用pegexp
语法举例:
1 | SELECT * FROM 表名 |
LIKE
匹配整个列,如果被匹配的文本在列值中出现,LIKE
将不会找到它,相应的行也不会被返回(除非使用通配符)。而REGEXP
在列值内进行匹配,如果被匹配的文本在列值中出现REGEXP
将会找到它,相应的行将被返回,并且REGEXP
能匹配整个列值(与LIKE
相同的作用)。
具体匹配规则这里写的很详细
所以,根据正则的结果查密码即可,先看一下登录成功界面的关键词。
构造
1 | select * from users where username='\' and passwd='|| passwd regexp \"^a\";%00' |
盲注。
当payload:username=\&passwd=||1;%00
,回显一个welcome.php
界面。
呃呃不会写脚本,思路大概是一个一个字符试。。看别人的:
1 | import requests |
跑出来
you_will_never_know7788990
输入密码提交得到flag
~
Tips
1.MySQL
的正则表达式匹配(自3.23.4版本后)不区分大小写。可以使用BINARY
关键字区分大小写。
2.%00
不能直接在输入框中输入。
参考
Author: suyumen
Link: https://suyumen.github.io/2021/05/20/2021-05-20-[NCTF2019]SQLi/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.